{% if is_async %}
/**
* @brief Callback type for {{ name.lower_snake_case }}_async.
*/
using {{ name.upper_camel_case }}Callback = std::function<void({% if has_result %}Result, {% endif %}{{ return_type.name }})>;

/**
 * @brief {{ method_description | replace('\n', '\n *')}}
 *
 * This function is non-blocking.{% if is_sync %} See '{{ name.lower_snake_case }}' for the blocking counterpart.{% endif %}
 */
void {{ name.lower_snake_case }}_async({% for param in params %}{% if param.type_info.name.endswith("Result") %}Result{% else %}{{ param.type_info.name }}{% endif %} {{ param.name.lower_snake_case }}, {% endfor %}const {{ name.upper_camel_case }}Callback callback);
{% endif %}

{% if is_sync %}
/**
 * @brief {{ method_description | replace('\n', '\n *')}}
 *
 * This function is blocking.{% if is_async %} See '{{ name.lower_snake_case }}_async' for the non-blocking counterpart.{% endif %}
 *
 * @return Result of request.
 */
{% if has_result %}std::pair<Result, {% endif %}{% if return_type.is_repeated %}std::vector<{% if not return_type.is_primitive%}{{ plugin_name.upper_camel_case }}::{% endif %}{{ return_type.inner_name }}>{% else %}{% if not return_type.is_primitive%}{{ plugin_name.upper_camel_case }}::{% endif %}{{ return_type.name }}{% endif %}{% if has_result %}>{% endif %} {{ name.lower_snake_case }}({% for param in params %}{% if param.type_info.name.endswith("Result") %}Result{% else %}{{ param.type_info.name }}{% endif %} {{ param.name.lower_snake_case }}{{ ", " if not loop.last }}{% endfor %}) const;
{% endif %}
